package com.iori.common.log;

import org.apache.log4j.Level;

public class BaseLog {

	/**
	 * ロギングラッパーのクラス名
	 */
	protected String FQCN;

	/**
	 * ロギング本体
	 */
	protected org.apache.log4j.Logger logger;

	/**
	 * 连接符
	 */
	private static String CONNECTOR = "|";

	/**
	 * Check whether this category is enabled for the <code>DEBUG</code>
	 *
	 * @return boolean - <code>true</code> if this category is debug enabled,
	 *         <code>false</code> otherwise.
	 */
	public boolean isDebugEnabled() {
		return logger.isDebugEnabled();
	}

	/**
	 * コンストラクタ
	 *
	 * @param cls
	 *            ログを出力するクラス
	 */
	protected BaseLog(Class cls) {
		logger = org.apache.log4j.Logger.getLogger(cls.getName());
		FQCN = this.getClass().getName();
	}

	protected void info(String termID, String userID, String msgID,
			String message) {
		String outputText = termID + CONNECTOR + userID + CONNECTOR + msgID
				+ CONNECTOR + message;
		logger.log(FQCN, Level.INFO, outputText, null);
	}

	/**
	 * 警告ログを出力する。
	 *
	 * @param termID
	 *            端末ID
	 * @param userID
	 *            ユーザID
	 * @param msgID
	 *            出力するログメッセージID
	 * @param message
	 *            出力するログメッセージ
	 */
	protected void warn(String termID, String userID, String msgID,
			String message) {
		String outputText = termID + CONNECTOR + userID + CONNECTOR + msgID
				+ CONNECTOR + message;
		logger.log(FQCN, Level.WARN, outputText, null);
	}

	/**
	 * 警告ログを出力する。
	 *
	 * @param cause
	 *            出力するエラー
	 * @param termID
	 *            端末ID
	 * @param userID
	 *            ユーザID
	 * @param msgID
	 *            出力するログメッセージID
	 * @param message
	 *            出力するログメッセージ
	 */
	protected void warn(Throwable cause, String termID, String userID,
			String msgID, String message) {
		String outputText = termID + CONNECTOR + userID + CONNECTOR + msgID
				+ CONNECTOR + message;
		logger.log(FQCN, Level.WARN, outputText, cause);
	}

	/**
	 * エラーログを出力する。
	 *
	 * @param termID
	 *            端末ID
	 * @param userID
	 *            ユーザID
	 * @param msgID
	 *            出力するログメッセージID
	 * @param message
	 *            出力するログメッセージ
	 */
	protected void error(String termID, String userID, String msgID,
			String message) {
		String outputText = termID + CONNECTOR + userID + CONNECTOR + msgID
				+ CONNECTOR + message;
		logger.log(FQCN, Level.ERROR, outputText, null);
	}

	/**
	 * エラーログを出力する。
	 *
	 * @param cause
	 *            出力するエラー
	 * @param termID
	 *            端末ID
	 * @param userID
	 *            ユーザID
	 * @param msgID
	 *            出力するログメッセージID
	 * @param message
	 *            出力するログメッセージ
	 */
	protected void error(Throwable cause, String termID, String userID,
			String msgID, String message) {
		String outputText = termID + CONNECTOR + userID + CONNECTOR + msgID
				+ CONNECTOR + message;
		logger.log(FQCN, Level.ERROR, outputText, cause);
	}

	protected void error(Throwable cause) {
		logger.log(FQCN, Level.ERROR, cause.getMessage(), cause);
	}

	/**
	 * 致命的ログを出力する。
	 *
	 * @param termID
	 *            端末ID
	 * @param userID
	 *            ユーザID
	 * @param msgID
	 *            出力するログメッセージID
	 * @param message
	 *            出力するログメッセージ
	 */
	protected void fatal(String termID, String userID, String msgID,
			String message) {
		String outputText = termID + CONNECTOR + userID + CONNECTOR + msgID
				+ CONNECTOR + message;
		logger.log(FQCN, Level.FATAL, outputText, null);
	}

	/**
	 * 致命的ログを出力する。
	 *
	 * @param cause
	 *            出力するエラー
	 * @param termID
	 *            端末ID
	 * @param userID
	 *            ユーザID
	 * @param msgID
	 *            出力するログメッセージID
	 * @param message
	 *            出力するログメッセージ
	 */
	protected void fatal(Throwable cause, String termID, String userID,
			String msgID, String message) {
		String outputText = termID + CONNECTOR + userID + CONNECTOR + msgID
				+ CONNECTOR + message;
		logger.log(FQCN, Level.FATAL, outputText, cause);
	}

	/**
	 * デバックログを出力する。
	 *
	 * @param msg
	 *            出力するログメッセージ
	 */
	public void debug(Object msg) {
		String outputText = msg.toString();
		logger.log(FQCN, Level.DEBUG, outputText, null);
	}

	protected void debug(String termID, String userID, String message) {
		String outputText = termID + CONNECTOR + userID + CONNECTOR + message;
		logger.log(FQCN, Level.DEBUG, outputText, null);
	}

}
